Multithreading হল একটি প্রোগ্রামিং প্যারাডাইম যা একাধিক থ্রেড (threads) ব্যবহার করে একটি প্রোগ্রামকে একসাথে একাধিক কাজ সম্পাদন করতে সক্ষম করে। জাভাতে মল্টিথ্রেডিং ব্যবহার করার মাধ্যমে, একটি প্রোগ্রাম একাধিক টাস্ককে সমান্তরালে (parallel) সম্পাদন করতে পারে, ফলে সিস্টেমের কর্মক্ষমতা এবং দ্রুততা বাড়ে। এটি বিশেষত তখন প্রয়োজনীয় হয় যখন একটি বড় অ্যাপ্লিকেশন বা সার্ভার একাধিক কাজ বা সার্ভিস একসাথে পরিচালনা করছে।
Multithreading এর বেসিক ধারণা
একটি থ্রেড হল একটি প্রোগ্রামের একক এক্সিকিউশন রুট। একাধিক থ্রেড একসাথে কাজ করলে সেই প্রোগ্রামটি মল্টিথ্রেডেড (multithreaded) হয়ে ওঠে। Multithreading এর সাহায্যে, একসাথে একাধিক কাজ সম্পাদিত হতে পারে, যা সাধারণত কম্পিউটিংয়ের গতি এবং দক্ষতা বাড়াতে সাহায্য করে।
Multithreading এর সুবিধা:
- সম্পাদনার গতি বাড়ানো: একাধিক থ্রেডের মাধ্যমে একসাথে কাজ করা যায়, ফলে সময়ের সাশ্রয় হয়।
- প্রোগ্রামের উন্নত প্রতিক্রিয়া: একাধিক থ্রেডের মাধ্যমে প্রোগ্রাম ইন্টারফেসে অনেক বেশি দ্রুত প্রতিক্রিয়া প্রদান করতে পারে।
- উন্নত রিসোর্স ব্যবস্থাপনা: CPU ব্যবহারের মাধ্যমে একাধিক কাজকে সমান্তরালে চালানো যায়, যার ফলে সিস্টেমের রিসোর্স গুলি আরও কার্যকরীভাবে ব্যবহৃত হয়।
Java তে Multithreading
জাভাতে থ্রেড তৈরি এবং পরিচালনার জন্য দুটি প্রধান পদ্ধতি আছে:
- Thread ক্লাসের মাধ্যমে থ্রেড তৈরি করা:
Threadক্লাস একটি থ্রেডের কাজ পরিচালনা করে। থ্রেড ক্লাসেরrun()মেথডে থ্রেডের কাজ সংজ্ঞায়িত করা হয়।
- Runnable ইন্টারফেসের মাধ্যমে থ্রেড তৈরি করা:
Runnableইন্টারফেস ব্যবহার করে, থ্রেডে কাজ করার জন্যrun()মেথডকে ইমপ্লিমেন্ট করা হয়। এটি থ্রেড ক্লাসের একটি সাবক্লাস না হয়ে, একটি স্বতন্ত্র ইন্টারফেস হিসেবে কাজ করে।
1. Thread ক্লাসের মাধ্যমে Multithreading
জাভায় থ্রেড তৈরি করার জন্য Thread ক্লাসের একটি সাবক্লাস তৈরি করা হয়, এবং run() মেথডের মধ্যে সেই থ্রেডের কার্যক্রম উল্লেখ করা হয়। থ্রেডটি শুরু করার জন্য start() মেথড কল করা হয়।
উদাহরণ:
class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
public static void main(String[] args) {
MyThread t1 = new MyThread(); // Create thread object
t1.start(); // Start the thread
}
}
এখানে, MyThread ক্লাসটি Thread ক্লাস থেকে ইনহেরিট করেছে, এবং run() মেথডে থ্রেডের কার্যকলাপ সংজ্ঞায়িত করা হয়েছে। start() মেথডটি থ্রেডটি চালু করে এবং run() মেথডটি বাস্তবায়ন হয়।
2. Runnable ইন্টারফেসের মাধ্যমে Multithreading
Runnable ইন্টারফেসও থ্রেড তৈরি করার জন্য ব্যবহৃত হয়, তবে এটি কম বেশি Thread ক্লাসের উপর ভিত্তি করে তৈরি করা হয়। এখানে run() মেথডে থ্রেডের কার্যক্রম সংজ্ঞায়িত করা হয় এবং তারপর Thread ক্লাসে এই Runnable ইন্টারফেসটি পাস করা হয়।
উদাহরণ:
class MyRunnable implements Runnable {
public void run() {
System.out.println("Thread is running using Runnable");
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread t1 = new Thread(myRunnable); // Create thread object
t1.start(); // Start the thread
}
}
এখানে, MyRunnable ক্লাসটি Runnable ইন্টারফেস ইমপ্লিমেন্ট করেছে এবং run() মেথডে কার্যক্রম উল্লেখ করা হয়েছে। তারপর, Thread ক্লাসে এই Runnable অবজেক্ট পাস করে থ্রেড তৈরি করা হয়েছে এবং start() মেথড কল করে থ্রেডটি চালু করা হয়েছে।
Thread এর Lifecycle
জাভায় থ্রেডের একটি নির্দিষ্ট lifecycle থাকে, যা কয়েকটি ধাপে বিভক্ত:
- New: থ্রেড তৈরি হয়েছে, তবে চালু হয়নি।
- Runnable: থ্রেড চালু হয়েছে এবং CPU থেকে প্রক্রিয়ার জন্য প্রস্তুত।
- Blocked: থ্রেড কোন রিসোর্সের জন্য অপেক্ষা করছে (যেমন, ফাইল বা ডেটাবেস অ্যাক্সেস)।
- Waiting: থ্রেড অন্য থ্রেডের মধ্যে কোন সিগন্যাল বা সিঙ্ক্রোনাইজেশন প্রক্রিয়ার জন্য অপেক্ষা করছে।
- Terminated: থ্রেড তার কাজ সম্পন্ন করেছে এবং বন্ধ হয়ে গেছে।
Thread Synchronization
যখন একাধিক থ্রেড একই রিসোর্সে অ্যাক্সেস করে, তখন Thread Synchronization প্রয়োজন হয়। যদি একাধিক থ্রেড একে অপরকে প্রভাবিত না করে, তাহলে race conditions ঘটতে পারে, যেখানে এক থ্রেডের কাজ অপর থ্রেডের কাজের উপর প্রভাব ফেলতে পারে। এই সমস্যা সমাধান করতে synchronized কীওয়ার্ড ব্যবহার করা হয়, যা শুধুমাত্র একটি থ্রেডকে একই সময়ে রিসোর্স অ্যাক্সেস করতে দেয়।
উদাহরণ:
class Counter {
private int count = 0;
// Synchronize method to prevent race condition
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final count: " + counter.getCount());
}
}
এখানে, increment() মেথডটি synchronized করা হয়েছে, যাতে একে একে শুধুমাত্র একটি থ্রেড এটিতে অ্যাক্সেস করতে পারে এবং race condition থেকে রক্ষা পায়।
সারাংশ
Multithreading হল এমন একটি প্রোগ্রামিং কৌশল যা একাধিক থ্রেডের মাধ্যমে একসাথে একাধিক কাজ সম্পাদন করার সুযোগ দেয়। জাভাতে থ্রেড তৈরি করা হয় Thread ক্লাস অথবা Runnable ইন্টারফেসের মাধ্যমে। থ্রেডের Lifecycle বিভিন্ন ধাপে বিভক্ত থাকে এবং Synchronization ব্যবহার করে একাধিক থ্রেডের মাঝে রিসোর্সের সঠিক ব্যবস্থাপনা করা হয়। Multithreading সিস্টেমের কর্মক্ষমতা এবং প্রতিক্রিয়া বাড়াতে সাহায্য করে, বিশেষ করে যখন একাধিক টাস্ক একসাথে সম্পাদন করা প্রয়োজন।
Read more